//
// Device.cpp for Device in /home/mambou_j//babel-2014
// 
// Made by jacquesquentin mamboumouafo
// Login   <mambou_j@epitech.net>
// 
// Started on  Tue May 15 01:02:01 2012 jacquesquentin mamboumouafo
// Last update Tue May 15 02:48:46 2012 jacquesquentin mamboumouafo
//


#include	"Device.hpp"
#include	"System.hpp"
#include	"Exception.hpp"

namespace	portaudio
{

  Device::Device(PaDeviceIndex index) : index_(index)
  {
    if (index == paNoDevice)
      info_ = NULL;
    else
      info_ = Pa_GetDeviceInfo(index);
  }

  Device::~Device()
  {
  }

  PaDeviceIndex	Device::index() const
  {
    return index_;
  }

  const	char *Device::name() const
  {
    if (info_ == NULL)
      return "";

    return info_->name;
  }

  int	Device::maxInputChannels() const
  {
    if (info_ == NULL)
      return 0;

    return info_->maxInputChannels;
  }

  int	Device::maxOutputChannels() const
  {
    if (info_ == NULL)
      return 0;

    return info_->maxOutputChannels;
  }

  PaTime	Device::defaultLowInputLatency() const
  {
    if (info_ == NULL)
      return static_cast<Patime>(0.0);

    return info_->defaultLowInputLatency;
  }

  PaTime	Device::defaultHighInputLatency() const
  {
    if (info_ == NULL)
      return static_cast<Patime>(0.0);

    return info_->defaultHighInputLatency;
  }

  PaTime	Device::defaultLowOutputLatency() const
  {
    if (info_ == NULL)
      return static_cast<PaTime>(0.0);

    return info_->defaultHighOutputLatency;
  }

  PaTime	Device::defaultHighOutputLatency() const
  {
    if (info_ == NULL)
      return static_cast<PaTime>(0.0);

    return info_->defaultHighOutputLatency;
  }

  double	Device::defaultSampleRate() const
  {
    if (info_ == NULL)
      return 0.0;

    return info_->defaultSampleRate;
  }

  bool	Device::isInputOnlyDevice() const
  {
    return (maxOutputChannels() == 0);
  }

  bool	Device::isOutputOnlyDevice() const
  {
    return (maxInputChannels() == 0);
  }

  bool	Device::isFullDuplexDevice() const
  {
    return (maxInputChannels() > 0 && maxOutputChannels() > 0);
  }

  bool	Device::isSystemfaultInputDevice() const
  {
    return (System::instance().defaultInputDevice() == *this);
  }

  bool	Device::isSystemDfaultOutputDevice() const
  {
    return (System::instance().defaultOutputDevice() == *this);
  }

  bool	Device::isHostApiDefaultInputDevice() const
  {
    return (hostApi().defaultInputDevice() == *this);
  }

  bool	Device::isHostApiDefaultOutputDevice() const
  {
    return (hostApi().defaultOutputDevice() == *this);
  }

  bool	Device::operator==(const Device &rhs)
  {
    return (index_ == rhs.index_);
  }

  bool	Device::operator!=(const Device &rhs)
  {
    return !(*this == rhs);
  }

  HostApi	&Device::hostApi()
  {
    if (info_ == NULL)
      throw PaException(paInternalError);

    return System::instance().hostApiIndex(info_->hostApi);
  }

  const	HostApi &Device::hostApi() const
  {
    if (info_ == NULL)
      throw PaException(paInternalError);

    return System::instance().hostApiByIndex(info_->hostApi);
  }
}
